/*
 * @Author jiangzhiwei
 * @Date 2023-07-19 11:34:04
 * @LastEditors jiangzhiwei
 * @LastEditTime 2023-07-28 11:35:11
 * @FilePath \test-cron\src\components\yc-cron\utils\componentutil.js
 * @Description 组件工具类
 */
import { isVue2, resolveComponent as resolveComponent2 } from 'vue-demi'
import { VALUE_EMIT_NAME } from './constant'

/**
 * @Author jiangzhiwei
 * @Date 2023-07-21 10:25:22
 * @Description 用于在render函数中动态加入组件
 * @param {string} componentName 组件名称
 * @return {VNode | string}
 */
export function resolveComponent (componentName) {
  return isVue2 ? componentName : resolveComponent2(componentName)
}

// /** 获取默认插槽里的东西 */
// export function getDefaultSlot (vm) {
//   if (isVue2) {
//     return vm.$slots.default 
//   } else {
//     return vm.$slots.default ? vm.$slots.default() : undefined
//   }
// }

/**
 * @Author jiangzhiwei
 * @Date 2023-07-21 10:21:00
 * @Description 获取插槽里的内容
 * @param {object} vm 组件实例对象，通常是this
 * @param {string} name 插槽名称，默认是default
 * @param {object} param 插槽参数
 * @return {object | Array | undefined} 插槽中的结点
 */
export function getSlot (vm, name = 'default', param) {
  let slot
  if (isVue2) {
    slot = vm.$scopedSlots[name]
  } else {
    slot = vm.$slots[name]
  }
  return slot ? slot(param) : undefined
}

/**
 * @Author jiangzhiwei
 * @Date 2023-07-21 10:23:36
 * @Description 获取组件的名称
 * @param {object} vm 组件实例对象，通常是this
 * @return {string} 组件名称
 */
export function getComponetName (vm) {
  return vm.$options.name
}

/**
 * @Author jiangzhiwei
 * @Date 2023-07-21 10:26:57
 * @Description 获取组件的属性值
 * @param {object} vm 组件实例对象，通常是this
 * @param {string} propName 组件属性名
 * @return {any} 属性值
 */
export function getComponentProp (vm, propName) {
  return isVue2 ? vm.data.props[propName] : vm.props[propName]
}

// /**
//  * @Author jiangzhiwei
//  * @Date 2023-07-25 14:23:48
//  * @Description 获取组件结点
//  * @param {object} vm 组件实例对象，通常是this
//  * @return {HTMLElement} 结点
//  */
// export function getComponentDom (vm) {
//   return isVue2 ? vm.elm : vm.el
// }

/**
 * @Author jiangzhiwei
 * @Date 2023-07-21 10:24:34
 * @Description emit事件
 * @param {object} vm 组件实例对象，通常是this
 * @param {any} value 传递的值
 * @param {string} name emit的名称。默认对应v-model的名称
 * @return {undefined}
 */
export function emitValue (vm, value, name = VALUE_EMIT_NAME) {
  vm.$emit(name, value)
}